﻿using System;
using System.Windows.Forms;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;
using Nortec.Security;
using Litografia.BusinessComponents;
using Litografia.BusinessEntities;

namespace Litografia.UI.Mantenimientos
{
    public partial class MantOperariosForm : BaseForm
    {
        public MantOperariosForm()
        {
            InitializeComponent();
        }

        #region Declarations
        BEOperario.OperarioDataTable Operarios;
        BEOperario.OperarioRow SelectedOperario;
        #endregion

        #region Event Handlers
        private void MantOperariosForm_Load(object sender, EventArgs e)
        {
            ConfigureToolBar(toolStrip, ToolBarButtons.Save |
                                        ToolBarButtons.New |
                                        ToolBarButtons.Delete |
                                        ToolBarButtons.Close);
            LoadOperariosGrid(true);
            ConfigureOperariosGrid();
            LoadPuestosCombo();
            toolStrip.ItemClicked += ToolStripItemClicked;
            ToggleButton(toolStrip, ToolBarButtons.Delete, false);
        }
        private void ToolStripItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            switch ((ToolBarButtons)e.ClickedItem.Tag)
            {
                case ToolBarButtons.Save:
                    Save();
                    break;
                case ToolBarButtons.Delete:
                    Delete();
                    break;
                case ToolBarButtons.New:
                    ClearControls(Controls);
                    txtNombre.Focus();
                    ToggleButton(toolStrip, ToolBarButtons.Delete, false);
                    operariosGrid.Selected.Rows.Clear();
                    operariosGrid.Refresh();
                    break;
                case ToolBarButtons.Close:
                    Close();
                    break;
            }
        }
        private void operariosGrid_AfterSelectChange(object sender, AfterSelectChangeEventArgs e)
        {
            if (operariosGrid.Selected.Rows.Count > 0)
            {
                if (operariosGrid.Selected.Rows[0].IsDataRow)
                {
                    var selectedId = (int)operariosGrid.Selected.Rows[0].Cells[Operarios.IdColumn.Ordinal].Value;
                    SelectedOperario = Operarios.FindById(selectedId);
                    UnPack(SelectedOperario);
                    ToggleButton(toolStrip, ToolBarButtons.Delete, true);
                }
                else operariosGrid.Selected.Rows.Clear();
            }
            else
            {
                SelectedOperario = null;
                ClearControls(Controls);
                ToggleButton(toolStrip, ToolBarButtons.Delete, false);
            }
        }
        #endregion

        #region Methods: Private
        private void LoadOperariosGrid(bool sort)
        {
            Operarios = BCOperario.Get(NortecMembership.CompanyId);
            operariosGrid.DataSource = Operarios;

            if (sort)
            {
                operariosGrid.DisplayLayout.Bands[0].SortedColumns.Clear();
                operariosGrid.DisplayLayout.Bands[0].SortedColumns.Add(operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.NombreColumn.Ordinal], false);
            }

            if (operariosGrid.Rows.Count > 0)
            {
                operariosGrid.ActiveRow = operariosGrid.Rows[0];
                //operariosGrid.Selected.Rows.Add(operariosGrid.Rows[0]);
            }
            else
            {
                SelectedOperario = null;
                ToggleButton(toolStrip, ToolBarButtons.Delete, false);
            }


        }
        private void ConfigureOperariosGrid()
        {

            // Oculta algunas columnas 
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.EmpresaIdColumn.Ordinal].Hidden = true;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.IdColumn.Ordinal].Hidden = true;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.PuestoIdColumn.Ordinal].Hidden = true;

            // Alineamientos
            foreach (UltraGridColumn col in operariosGrid.DisplayLayout.Bands[0].Columns)
                col.Header.Appearance.TextHAlign = HAlign.Center;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.CostoxHoraColumn.Ordinal].CellAppearance.TextHAlign = HAlign.Right;

            // Ancho de columnas
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.NombreColumn.Ordinal].Width = 250;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.PuestoNombreColumn.Ordinal].Width = 160;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.CostoxHoraColumn.Ordinal].Width = 100;

            // Formato de despliege
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.CostoxHoraColumn.Ordinal].Format = "#,##0.00";

            // Filters
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.NombreColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.CostoxHoraColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.PuestoNombreColumn.Ordinal].AllowRowFiltering = DefaultableBoolean.False;

            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.NombreColumn.Ordinal].Header.Caption = "Nombre";
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.PuestoNombreColumn.Ordinal].Header.Caption = "Puesto";
            operariosGrid.DisplayLayout.Bands[0].Columns[Operarios.CostoxHoraColumn.Ordinal].Header.Caption = "Costo x Hora";

            operariosGrid.DisplayLayout.Bands[0].Override.CellClickAction = CellClickAction.RowSelect;
        }
        private void UnPack(BEOperario.OperarioRow operario)
        {
            txtNombre.Text = operario.Nombre;
            cmbPuesto.SelectedValue = operario.PuestoId;
            txtCosto.Text = operario.CostoxHora.ToString();
        }
        private void LoadPuestosCombo()
        {
            var puestos = BCPuesto.Get(NortecMembership.CompanyId);
            cmbPuesto.ValueMember = puestos.IdColumn.ColumnName;
            cmbPuesto.DisplayMember = puestos.NombreColumn.ColumnName;
            cmbPuesto.DataSource = puestos;
        }
        private void Save()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                if (ValidateEntries())
                {
                    var row = Pack();
                    if (SelectedOperario == null)
                        BCOperario.Add(row);
                    else
                        BCOperario.Update(row);
                    ClearControls(Controls);
                    LoadOperariosGrid(false);
                }
            }
            catch (Exception ex)
            {
                DisplayError("No se pudo guardar la información del operario.", ex);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
        private bool ValidateEntries()
        {
            bool functionReturnValue = false;
            string msg = "";
            decimal costo;

            if (string.IsNullOrEmpty(txtNombre.Text))
            {
                msg = "Debe ingresar el nombre del operario";
                txtNombre.Focus();
            }
            else if (string.IsNullOrEmpty(cmbPuesto.Text))
            {
                msg = "Debe seleccionar el puesto del operario";
                txtNombre.Focus();
            }
            else if (!Decimal.TryParse(txtCosto.Text, out costo) || costo <= 0)
            {
                msg = "El costo por hora ingresado no es válido";
                txtCosto.Focus();
            }
            else
                functionReturnValue = true;

            if (!functionReturnValue)
                MessageBox.Show(msg, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return functionReturnValue;
        }
        private BEOperario.OperarioRow Pack()
        {
            var operario = (new BEOperario.OperarioDataTable()).NewOperarioRow();

            if (SelectedOperario != null)
                operario.Id = SelectedOperario.Id;

            operario.EmpresaId = NortecMembership.CompanyId;
            operario.Nombre = txtNombre.Text.Trim();
            operario.PuestoId = (int)cmbPuesto.SelectedValue;
            operario.CostoxHora = Convert.ToDecimal(txtCosto.Text);

            return operario;
        }
        private void Delete()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                if (SelectedOperario == null)
                    MessageBox.Show("Debe seleccionar un operario antes de eliminarlo.", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                else
                {
                    if (MessageBox.Show("¿Está seguro de eliminar el operario \"" + SelectedOperario.Nombre + "\"?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        BCOperario.Delete(SelectedOperario.Id);
                        ClearControls(Controls);
                        LoadOperariosGrid(false);
                    }
                }
            }
            catch (Exception ex)
            {
                DisplayError("No se pudo eliminar la información del operario.", ex);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }
        #endregion
    }
}
